package com.whynot.frame.basic.redis.service;


import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 描述: Redis独有的数据类型接口:
 * 作者: chenyao
 * 日期: 2018-01-30.
 * 项目名称: curtain-whynot-basic-redis
 * 版本: 1.0.0
 * JDK: since 1.8
 */
public interface IRedisClient {

    /**
     * 描  述: 写入Cache，当前实例对象T,同时转成Json格式
     * 参  数:key
     * 参  数:value
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public <T> void set(String key, T value);

    /**
     * 描  述: 写入Cache，字符串对象
     * 参  数:key
     * 参  数:value
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void set(String key, String value);

    /**
     * 描  述: 写入Cache，当前实例对象T, 同时转成Json格式，并设置失效时间
     * 参  数:key
     * 参  数:value
     * 参  数:time
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public <T> void setex(String key, T value, int time);

    /**
     * 描  述: 写入Cache，字符串对象，并设置失效时间
     * 参  数:key
     * 参  数:value
     * 参  数:time
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void setex(String key, String value, int time);

    /**
     * 描  述: 将指定的对象value以key为主键缓存到cache服务中
     * 参  数:key
     * 参  数:value
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void setObject(String key, Object value);

    /**
     * 描  述: 将指定的对象value以key为主键缓存到cache服务中,并设置失效时间
     * 参  数:key
     * 参  数:value
     * 参  数:time
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void setexObject(String key, Object value, int time);

    /**
     * 二级制存储
     * @param value
     * @param time
     */
    public void setexObjectByte(String key,Object value,int time);

    /**
     * 描  述: 获取Cache对象，字符串对象
     * 参  数:key
     * 返回值: java.lang.String
     * 创建时间: 2018/05/15
     */
    public String get(String key);

    /**
     * 描  述: 获取Cache对象，当前实例对象T
     * 参  数:key
     * 参  数:clazz
     * 返回值: T
     * 创建时间: 2018/05/15
     */
    public <T> T get(String key, Class<T> clazz);

    /**
     * 描  述: 返回指定key的cache对象
     * 参  数:key
     * 返回值: java.lang.Object
     * 创建时间: 2018/05/15
     */
    public Object getObject(String key);

    /**
     * 获取二进制对象
     * @param key
     * @return
     */
    public Object getObjectByte(String key);

    /**
     * 描  述: 删除指定的缓存对象
     * 参  数:key
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void remove(String key);


    /**
     * 描  述: 获取当前的所有缓存的目录
     * 参  数:
     * 返回值: java.lang.Long
     * 创建时间: 2018/05/15
     */
    public Long dbSize();

    /**
     * 描  述:清空当前缓存
     * 参  数:
     * 返回值: void
     * 创建时间: 2018/05/15
     */
    public void flushDB();

    /**
    * 描  述: 插入Map对象，是Set类型的
    * 参  数:keyValues
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void mset(final Map<String, String> keyValues);


    /**
    * 描  述: 获取List对象
    * 参  数:keys
    * 返回值: java.util.List<java.lang.Object>
    * 创建时间: 2018/05/15
    */
    public List<Object> mget(final String[] keys);


    /**
    * 描  述: 列表左入栈
    * 参  数:key
    * 参  数:value
    * 返回值: long
    * 创建时间: 2018/05/15
    */
    public long lpush(final String key, final String value);

    /**
    * 描  述: 列表右入栈
    * 参  数:key
    * 参  数:value
    * 返回值: long
    * 创建时间: 2018/05/15
    */
    public long rpush(final String key, String value);

    /**
    * 描  述: 列表左出栈
    * 参  数:key
    * 返回值: java.lang.String
    * 创建时间: 2018/05/15
    */
    public String lpop(final String key);

    /**
    * 描  述: 列表右出栈
    * 参  数:key
    * 返回值: java.lang.String
    * 创建时间: 2018/05/15
    */
    public String rpop(final String key);

    /**
    * 描  述: 获取列表范围数据
    * 参  数:key
    * 参  数:start
    * 参  数:end
    * 返回值: java.util.List<java.lang.String>
    * 创建时间: 2018/05/15
    */
    public List<String> lrange(final String key, final long start,
                               final long end);

    /**
    * 描  述: 插入Hash对象，单个插入
    * 参  数:key
    * 参  数:field
    * 参  数:value
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void hsetObject(final String key, final String field,
                           final Object value);

    /**
    * 描  述: 获取Hash对象的值，根据key找到Hash，再根据field找到对应value
    * 参  数:key
    * 参  数:field
    * 返回值: java.lang.Object
    * 创建时间: 2018/05/15
    */
    public Object hgetObject(final String key, final String field);

    /**
    * 描  述: 根据key获取Hash对象
    * 参  数:key
    * 返回值: java.util.Map<java.lang.String,java.lang.Object>
    * 创建时间: 2018/05/15
    */
    public Map<String, Object> hgetAllObjects(final String key);

    /**
    * 描  述: 删除对应Hash的对应field
    * 参  数:key
    * 参  数:field
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void hdelObject(final String key, final String field);

    /**
    * 描  述: 存入set集合，将set按数组存入
    * 参  数:key
    * 参  数:member
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void sadd(final String key, final String... member);


    /**
    * 描  述: 获取set集合
    * 参  数:key
    * 返回值: java.util.Set<java.lang.Object>
    * 创建时间: 2018/05/15
    */
    public Set<Object> smembers(final String key);

    /**
    * 描  述: 移除集合中多个value值
    * 参  数:key
    * 参  数:member
    * 返回值: java.lang.Long
    * 创建时间: 2018/05/15
    */
    public Long removeSet(final String key, final String... member);


    /**
    * 描  述: 设置key的失效时间
    * 参  数:key
    * 参  数:time
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void expire(final String key, final int time);

    /**
    * 描  述: 获取模糊匹配的key
    * 参  数:pattern
    * 返回值: java.util.Set<java.lang.String>
    * 创建时间: 2018/05/15
    */
    public Set<String> getKeys(final String pattern);

    /**
    * 描  述: 获取所有key
    * 参  数:
    * 返回值: java.util.Set<java.lang.String>
    * 创建时间: 2018/05/15
    */
    public Set<String> getAllKey();

    /**
    * 描  述: 关闭当前Redis连接
    * 参  数:
    * 返回值: void
    * 创建时间: 2018/05/15
    */
    public void shutDown();
}
